﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using GestionePolveri2.DAL;
using GestionePolveriLib.BL;
using FrameworkLib.Facades;

namespace GestionePolveriLib.Facades
{
    [Serializable]
    public class ImpiantoFacade : FacadeBase<GestionePolveriEntities>
    {
        public ImpiantoFacade()
        {

        }

        public void LoadImpiantoAsync(BackgroundWorkerCallbackBase.Callback callback)
        {
            this.RunAsync(() => GetImpianti(), callback);
        }

        public List<Impianto> GetImpianti()
        {
            List<Impianto> retValue = null;

            try
            {
                var obj = from x in this.GetContext().Impianti 
                          where x.Impianto != "Inventario"
                          select new Impianto
                          {
                              ID = x.IDImpianto,
                              Nome = x.Impianto,
                              Fittizio = x.Fittizio
                          };

                if (obj.Any())
                {
                    retValue = obj.ToList();
                }
            }
            catch (Exception ex)
            {
                // throw ex;
            }

            return retValue;
        }

        public bool AddImpianto(Impianto impianto)
        {
            bool retValue = false;

            try
            {
                Impianti imp = new Impianti();
                imp.Impianto = impianto.Nome;
                imp.Fittizio = impianto.Fittizio;

                this.GetContext().Impianti.AddObject(imp);
                this.GetContext().SaveChanges();

                retValue = true;
            }
            catch (Exception ex)
            {
                // throw ex;
            }
            
            return retValue;
        }

        public bool DeleteImpianto(Impianto impianto)
        {
            bool retValue = false;

            try
            {
                var obj = from x in this.GetContext().Impianti
                          where x.Impianto == impianto.Nome
                          select x;

                if (obj.Any())
                {
                    this.GetContext().Impianti.DeleteObject(obj.FirstOrDefault());
                    this.GetContext().SaveChanges();

                    retValue = true;
                }
            }
            catch (Exception ex)
            {
                // throw ex;
            }

            return retValue;
        }

        public bool ModifyImpianto(Impianto impianto)
        {
            bool retValue = false;

            try
            {
                var obj = from x in this.GetContext().Impianti
                          where x.IDImpianto == impianto.ID
                          select x;

                if (obj.Any())
                {
                    Impianti imp = obj.FirstOrDefault();
                    imp.Impianto = impianto.Nome;
                    imp.Fittizio = impianto.Fittizio;

                    this.GetContext().SaveChanges();

                    retValue = true;
                }
            }
            catch (Exception ex)
            {
                // throw ex;
            }

            return retValue;
        }

        public Impianto GetImpianto(string nome)
        {
            Impianto retValue = null;

            try
            {
                var obj = from x in this.GetContext().Impianti
                          where x.Impianto == nome
                          select new Impianto
                          {
                              ID = x.IDImpianto,
                              Nome = x.Impianto,
                              Fittizio = x.Fittizio
                          };

                if (obj.Any())
                {
                    retValue = obj.FirstOrDefault();
                }
            }
            catch (Exception ex)
            {
                // throw ex;
            }

            return retValue;
        }

        public Impianto GetImpianto(int idImpianto)
        {
            Impianto retValue = null;

            try
            {
                var obj = from x in this.GetContext().Impianti
                          where x.IDImpianto == idImpianto
                          select new Impianto
                          {
                              ID = x.IDImpianto,
                              Nome = x.Impianto,
                              Fittizio = x.Fittizio
                          };

                if (obj.Any())
                {
                    retValue = obj.FirstOrDefault();
                }
            }
            catch (Exception ex)
            {
                // throw ex;
            }

            return retValue;
        }

        public Impianto GetImpiantoByNome(string impianto)
        {
            Impianto retValue = null;

            try
            {
                GestionePolveriEntities context = this.GetContext();
                var obj = from x in context.Impianti
                          where x.Impianto == impianto
                          select new Impianto
                          {
                              ID = x.IDImpianto,
                              Nome=x.Impianto,
                              Fittizio=x.Fittizio                             
                          };

                if (obj.Any())
                {
                    retValue = obj.FirstOrDefault();
                }
            }
            catch (Exception ex)
            {
                // throw;
            }

            return retValue;
        }

    }
}
